package org.example.app.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.example.system.entity.AppUserEntity;
import org.example.system.service.AppUserService;
import org.example.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 小程序用户控制层
 */
@RestController
@RequestMapping("/app/user")
@Slf4j
public class AppUserController {
    @Autowired
    private AppUserService userService;

    /**
     * 小程序用户登录
     * @param loginAppUser
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody AppUserEntity loginAppUser){
        log.info("--------AppUserController | login | input:{}", JSON.toJSONString(loginAppUser));
        //判断用户名和密码是否为空
        if (StrUtil.isEmpty(loginAppUser.getUsername()) || StrUtil.isEmpty(loginAppUser.getPassword())){
            return R.fail("参数错误");
        }
        //通过用户名查询用户
        AppUserEntity exitAppUser = userService.getOne(loginAppUser.getUsername());
        //如果用户不存在，提示用户名错误
        //如果用户存在，再去匹配密码，如果密码不匹配，提示密码错误
        if (exitAppUser == null || !DigestUtil.bcryptCheck(loginAppUser.getPassword(),exitAppUser.getPassword())){
            return R.fail("用户名或密码错误");
        }
        //判断用户是否启用
        if (exitAppUser.getEnable().equals("0")){
            return R.fail("该用户已停用");
        }
        Object token = userService.login(exitAppUser);
        return R.ok(token);
    }

    /**
     * 按条件分页查询
     * @param user
     * @return
     */
    @GetMapping("/list")
    public R list(AppUserEntity user){
        log.info("------------AppUserController | list | input : {} ", JSON.toJSONString(user));
        IPage<AppUserEntity> page = userService.selectPage(user);
        log.info("------------AppUserController | list | return : {} ", JSON.toJSONString(page));
        return R.ok(page);
    }

    /**
     * 添加
     * @param user
     * @return
     */
    @PostMapping("/add")
    public R add(@RequestBody AppUserEntity user){
        log.info("---------AppUserController | add | input : {}", JSON.toJSON(user));
        int row = userService.add(user);
        if(row <= 0){
            return R.fail("添加失败");
        }
        return R.ok("添加成功");
    }

    /**
     * 修改
     * @param user
     * @return
     */
    @PutMapping("/update")
    public R update(@RequestBody AppUserEntity user){
        log.info("---------AppUserController | update | input : {}", JSON.toJSON(user));
        if(null == user.getId() || user.getId() <= 0){
            return R.fail("参数错误:ID未传入");
        }
        int row = userService.update(user);
        if(row <= 0){
            return  R.fail("修改失败");
        }
        return R.ok("修改成功");
    }

    /**
     * 修改密码
     * @param user
     * @return
     */
    @PutMapping("/updatePassword")
    public R updatePassword(@RequestBody AppUserEntity user){
        log.info("---------AppUserController | update | input : {}", JSON.toJSON(user));
        if(null == user.getId() || user.getId() <= 0){
            return R.fail("参数错误:ID未传入");
        }
        userService.update(user);
        return R.ok("修改密码成功");
    }
    /**
     * 根据id查询小程序用户数据
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R getInfo(@PathVariable("id") Long id){
        log.info("---------AppUserController | getInfo | input : {}", JSON.toJSON(id));
        return R.ok(userService.getOne(id));
    }

    /**
     * 根据username查询小程序用户数据
     * @param username
     * @return
     */
    @GetMapping("/select")
    public R getInfo(String username){
        log.info("---------AppUserController | getInfo | input : {}", JSON.toJSON(username));
        return R.ok(userService.getOne(username));
    }
}
